package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.DebitoConsumoBusiness;
import br.com.business.EmailBusiness;
import br.com.businesssql.AntecipacaoGCardBusiness;
import br.com.businesssql.RepasseBusiness;
import br.com.data.DebitoConsumo;
import br.com.data.Parceiro;
import br.com.datasql.MovimentacaoEstabelecimentoGCard;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class LojistaGerenciamentoRecebimentoAntecipadoBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = -7141645566388807910L;

    private SessionUsaPreBean sessionUsaPreBean;

    private DebitoConsumoBusiness debitoConsumoBusiness;
    private RepasseBusiness repasseBusiness;
    private EmailBusiness emailBusinessImpl;
    private AntecipacaoGCardBusiness antecipacaoGCardBusinessImpl;

    private Parceiro parceiro;

    private Date dataini;
    private Date datafim;

    private List<MovimentacaoEstabelecimentoGCard> movimentoEstabelecimentoGcard;

    private List<DebitoConsumo> debitoConsumo;
    private Integer qtdeRegistros;
    private Integer qtdeEscolhido;
    private Double valor;

    private Double valorBrutoRepasse;
    private Double valorLiquidoRepasse;
    private Double valorLiquido;

    private String repasseSelecaoOpcao;

    private boolean marcarTodos;

    public boolean isMarcarTodos() {
	return marcarTodos;
    }

    public void setMarcarTodos(boolean marcarTodos) {
	this.marcarTodos = marcarTodos;
    }

    /**
     * Construtor
     */
    @Autowired
    public LojistaGerenciamentoRecebimentoAntecipadoBean(SessionUsaPreBean sessionUsaPreBean,
	    DebitoConsumoBusiness debitoConsumoBusiness, RepasseBusiness repasseBusiness, EmailBusiness emailBusiness,
	    AntecipacaoGCardBusiness antecipacaoGCardBusinessImpl) {

	this.sessionUsaPreBean = sessionUsaPreBean;

	this.debitoConsumoBusiness = debitoConsumoBusiness;
	this.repasseBusiness = repasseBusiness;
	this.emailBusinessImpl = emailBusiness;
	this.antecipacaoGCardBusinessImpl = antecipacaoGCardBusinessImpl;

	parceiro = this.sessionUsaPreBean.getParceiro();

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	Calendar cal = Calendar.getInstance();
	cal.setTime(new Date());

	datafim = cal.getTime();

	cal.add(Calendar.MONTH, -1);

	dataini = cal.getTime();

	buscar();

	buscarRepasses();
    }

    /**
     * buscarRepasses
     */
    public void buscarRepasses() {

	try {

	    if (this.datafim.compareTo(this.dataini) == 0 || this.datafim.compareTo(this.dataini) == 1) {

		Calendar dataInicial = Calendar.getInstance();
		Calendar dataFinal = Calendar.getInstance();

		this.tratarDataBuscaVendas(dataInicial, dataFinal);

		movimentoEstabelecimentoGcard = antecipacaoGCardBusinessImpl.buscarAntecipacaoPorData(dataini, datafim,
			parceiro.getCodigoGcard());

		valorLiquido = 0d;

	    } else {
		String msg = super.getMensagem("MN_data_final_maior_inicio");
		enviaMensagem(msg, msg);
	    }

	} catch (Exception e) {
	    enviaMensagem(e.getMessage(), e.getMessage());
	}

    }

    public void atualizarValorAutorizacaoAntecipacao() {

	Integer quantidadeRepasse = 0;

	Double valorTotalRepasse = 0d;
	Double valorTotalLiquido = 0d;

	Double valorTotalRepasseNaoSelecionado = 0d;

	Double valorTotalLiquidoNaoSelecionado = 0d;

	for (MovimentacaoEstabelecimentoGCard it : movimentoEstabelecimentoGcard) {
	    valorTotalRepasse += it.getValorLiquido();
	    valorTotalLiquido += it.getValorLiquido();
	    if (it.getSelecionado() != null && it.getSelecionado().equals(Boolean.TRUE)) {
		quantidadeRepasse++;
	    } else {
		valorTotalRepasseNaoSelecionado += it.getValorLiquido();
		valorTotalLiquidoNaoSelecionado += it.getValorLiquido();
	    }
	}

	if (quantidadeRepasse == 1) {
	    for (MovimentacaoEstabelecimentoGCard it : movimentoEstabelecimentoGcard) {
		if (it.getSelecionado() != null && it.getSelecionado().equals(Boolean.TRUE)) {
		    setValorBrutoRepasse(it.getValorLiquido());
		    setValorLiquidoRepasse(it.getValorLiquido());
		}
	    }
	} else if (quantidadeRepasse == 0) {
	    setValorBrutoRepasse(0d);
	    setValorLiquidoRepasse(0d);
	} else {

	    setValorBrutoRepasse(valorTotalRepasse - valorTotalRepasseNaoSelecionado);
	    setValorLiquidoRepasse(valorTotalLiquido - valorTotalLiquidoNaoSelecionado);
	}
    }

    /**
     * buscar
     */
    public void buscar() {

	List<Criterio> criterios = new ArrayList<Criterio>();

	Criterio crit01 = new Criterio();

	crit01.setCampo("parceiro.id");
	crit01.setComparacao("=");
	crit01.setTipo(Criterio.TIPO_INTEGER);
	crit01.setValue(parceiro.getId());

	criterios.add(crit01);

	Calendar calinitp = Calendar.getInstance();
	Calendar calfimtp = Calendar.getInstance();

	calinitp.setTime(dataini);
	calfimtp.setTime(datafim);

	calinitp.set(Calendar.HOUR_OF_DAY, 0);
	calinitp.set(Calendar.MINUTE, 0);
	calinitp.set(Calendar.SECOND, 0);
	calinitp.set(Calendar.MILLISECOND, 0);

	calfimtp.set(Calendar.HOUR_OF_DAY, 23);
	calfimtp.set(Calendar.MINUTE, 59);
	calfimtp.set(Calendar.SECOND, 59);
	calfimtp.set(Calendar.MILLISECOND, 999);

	Criterio crit02 = new Criterio();

	crit02.setCampo("data");
	crit02.setComparacao(">=");
	crit02.setTipo(Criterio.TIPO_TIMESTAMP);
	crit02.setValue(calinitp.getTime());

	criterios.add(crit02);

	Criterio crit03 = new Criterio();

	crit03.setCampo("data");
	crit03.setComparacao("<=");
	crit03.setTipo(Criterio.TIPO_TIMESTAMP);
	crit03.setValue(calfimtp.getTime());

	criterios.add(crit03);

	debitoConsumo = debitoConsumoBusiness.buscarPorCriterios(criterios, "data");

	Integer a = 1;
	for (DebitoConsumo db : debitoConsumo) {
	    db.setOrdem(a);
	    if (a == 1)
		a = 2;
	    else
		a = 1;
	    db.setEscolhido(Boolean.FALSE);
	}

	qtdeRegistros = debitoConsumo.size();

    }

    /**
     * <p>
     * Método responsável por selecionar todos os itens de repasse na grid
     * <p>
     * 
     * @author Waltenes Junior
     */
    public void marcarTodoItenRepasse() {

	for (MovimentacaoEstabelecimentoGCard movEsc : this.movimentoEstabelecimentoGcard) {
	    if (!marcarTodos)
		movEsc.setSelecionado(Boolean.FALSE);
	    else
		movEsc.setSelecionado(Boolean.TRUE);
	}
	this.atualizarValorAutorizacaoAntecipacao();
    }

    /**
     * <p>
     * Método responsável por enviar email de antecipação de repasse
     * <p>
     * 
     * @author Waltenes Junior
     */
    public void enviarEmailRecebimento() {
	emailBusinessImpl.enviar("atendimento@nacionalsa.com.br", "Contatos", "Antecipação de repasse",
		this.montarMensagem());
	String msg = super.getMensagem("MN_solicitacao_sucesso_aguarde_contato");
	enviaMensagem(msg, msg);
    }

    /**
     * <p>
     * Método responsável por montar a mensagem de email
     * <p>
     * 
     * @return String montada
     * @author Waltenes Junior
     */
    private String montarMensagem() {
	StringBuffer buffer = new StringBuffer();

	buffer.append("<html> O cliente " + parceiro.getNomeFantasia() + " código "
		+ parceiro.getCodigoGcard().toString() + " enviou pedido para <br/>");
	buffer.append("antecipação dos seguintes valores: <br/><br/>");
	for (MovimentacaoEstabelecimentoGCard itMovEsc : this.movimentoEstabelecimentoGcard) {
	    if (itMovEsc.getSelecionado() != null && itMovEsc.getSelecionado().equals(Boolean.TRUE)) {
		buffer.append("R$" + itMovEsc.getValorLiquido().toString() + "  " + itMovEsc.getDataRepasse() + "<br/>");
	    }
	}
	buffer.append("<br/>Favor entrar em contato com cliente telefone " + this.parceiro.getTelefone()
		+ " para prosseguir com a negociação.<html/>");

	return buffer.toString();
    }

    /**
     * marcarTodos
     */
    public void marcarTodos() {
	valor = 0d;
	qtdeEscolhido = 0;
	for (DebitoConsumo db : debitoConsumo) {
	    db.setEscolhido(Boolean.TRUE);
	    valor += db.getValor();
	    qtdeEscolhido++;
	}
    }

    /**
     * desmarcarTodos
     */
    public void desmarcarTodos() {
	valor = 0d;
	qtdeEscolhido = 0;
	for (DebitoConsumo db : debitoConsumo) {
	    db.setEscolhido(Boolean.FALSE);
	}
    }

    /**
     * atualizaValorQtde
     */
    public void atualizaValorQtde() {
	valor = 0d;
	qtdeEscolhido = 0;
	for (DebitoConsumo db : debitoConsumo) {
	    if (db.getEscolhido()) {
		valor += db.getValor();
		qtdeEscolhido++;
	    }
	}
    }

    /**
     * confirmarRecebimento
     */
    public void confirmarRecebimento() {

    }

    /**
     * <p>
     * Método responsável por tratar as datas para parâmetros da consulta de
     * vendas
     * <p>
     * 
     * @param dataInicial
     * @param dataFinal
     * @author Waltenes Junior
     */
    private void tratarDataBuscaVendas(Calendar dataInicial, Calendar dataFinal) {

	dataInicial.setTime(dataini);
	dataFinal.setTime(datafim);

	dataInicial.add(Calendar.DAY_OF_MONTH, 1);
	dataInicial.set(Calendar.HOUR_OF_DAY, 0);
	dataInicial.set(Calendar.MINUTE, 0);
	dataInicial.set(Calendar.SECOND, 0);
	dataInicial.set(Calendar.MILLISECOND, 0);

	dataFinal.add(Calendar.DAY_OF_MONTH, 1);
	dataFinal.set(Calendar.HOUR_OF_DAY, 23);
	dataFinal.set(Calendar.MINUTE, 59);
	dataFinal.set(Calendar.SECOND, 59);
	dataFinal.set(Calendar.MILLISECOND, 999);
    }

    // SETS AND GETS
    public Parceiro getParceiro() {
	return parceiro;
    }

    public void setParceiro(Parceiro parceiro) {
	this.parceiro = parceiro;
    }

    public Date getDataini() {
	return dataini;
    }

    public void setDataini(Date dataini) {
	this.dataini = dataini;
    }

    public Date getDatafim() {
	return datafim;
    }

    public void setDatafim(Date datafim) {
	this.datafim = datafim;
    }

    public List<DebitoConsumo> getDebitoConsumo() {
	return debitoConsumo;
    }

    public void setDebitoConsumo(List<DebitoConsumo> debitoConsumo) {
	this.debitoConsumo = debitoConsumo;
    }

    public Integer getQtdeRegistros() {
	return qtdeRegistros;
    }

    public void setQtdeRegistros(Integer qtdeRegistros) {
	this.qtdeRegistros = qtdeRegistros;
    }

    public Double getValor() {
	return valor;
    }

    public void setValor(Double valor) {
	this.valor = valor;
    }

    public Integer getQtdeEscolhido() {
	return qtdeEscolhido;
    }

    public void setQtdeEscolhido(Integer qtdeEscolhido) {
	this.qtdeEscolhido = qtdeEscolhido;
    }

    public RepasseBusiness getRepasseBusiness() {
	return repasseBusiness;
    }

    public void setRepasseBusiness(RepasseBusiness repasseBusiness) {
	this.repasseBusiness = repasseBusiness;
    }

    public Double getValorLiquido() {
	return valorLiquido;
    }

    public void setValorLiquido(Double valorLiquido) {
	this.valorLiquido = valorLiquido;
    }

    public String getRepasseSelecaoOpcao() {
	return repasseSelecaoOpcao;
    }

    public void setRepasseSelecaoOpcao(String repasseSelecaoOpcao) {
	this.repasseSelecaoOpcao = repasseSelecaoOpcao;
    }

    public DebitoConsumoBusiness getDebitoConsumoBusiness() {
	return debitoConsumoBusiness;
    }

    public void setDebitoConsumoBusiness(DebitoConsumoBusiness debitoConsumoBusiness) {
	this.debitoConsumoBusiness = debitoConsumoBusiness;
    }

    public EmailBusiness getEmailBusinessImpl() {
	return emailBusinessImpl;
    }

    public void setEmailBusinessImpl(EmailBusiness emailBusinessImpl) {
	this.emailBusinessImpl = emailBusinessImpl;
    }

    public AntecipacaoGCardBusiness getAntecipacaoGCardBusinessImpl() {
	return antecipacaoGCardBusinessImpl;
    }

    public void setAntecipacaoGCardBusinessImpl(AntecipacaoGCardBusiness antecipacaoGCardBusinessImpl) {
	this.antecipacaoGCardBusinessImpl = antecipacaoGCardBusinessImpl;
    }

    public List<MovimentacaoEstabelecimentoGCard> getMovimentoEstabelecimentoGcard() {
	return movimentoEstabelecimentoGcard;
    }

    public void setMovimentoEstabelecimentoGcard(List<MovimentacaoEstabelecimentoGCard> movimentoEstabelecimentoGcard) {
	this.movimentoEstabelecimentoGcard = movimentoEstabelecimentoGcard;
    }

    public Double getValorBrutoRepasse() {
	return valorBrutoRepasse;
    }

    public void setValorBrutoRepasse(Double valorBrutoRepasse) {
	this.valorBrutoRepasse = valorBrutoRepasse;
    }

    public Double getValorLiquidoRepasse() {
	return valorLiquidoRepasse;
    }

    public void setValorLiquidoRepasse(Double valorLiquidoRepasse) {
	this.valorLiquidoRepasse = valorLiquidoRepasse;
    }

}
